package swimv2gm.bl.session;

import java.util.List;

import javax.ejb.Remote;

import swimv2gm.bl.domain.Ability;
import swimv2gm.bl.util.UserData;

/**
 * Il gestore delle competenze inserite nel sistema, permette di crearle,
 * modificarle ed effettuare ricerche.
 * 
 * @author Matteo Gallesio
 */
@Remote
public interface AbilityManager {
	/**
	 * Inserisce una nuova competenza con il nome e la descrizioni indicati
	 * 
	 * @param nome
	 *            il nome della competenza
	 * @param descrizione
	 *            la descrizione della competenza
	 * @return l'id della competenza, o <code>-1</code> se l'inserimento è
	 *         fallito.
	 * @throws ExistingDataException
	 *             quando esiste già una competenza con il nome specificato.
	 */
	public long createAbility(String nome,String descrizione) throws ExistingDataException;

	/**
	 * Modifica una competenza con i dati forniti.
	 * 
	 * @param cid
	 *            l'id della competenza da modificare
	 * @param nome
	 *            il nuovo nome
	 * @param descrizione
	 *            la nuova descrizione
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti
	 * @throws ExistingDataException
	 *             se esiste già un'altra competenza con il nome specificato
	 */
	public boolean editAbility(long cid,String nome,String descrizione) throws ExistingDataException;

	/**
	 * Ottiene la competenza con l'id specificato.
	 * 
	 * @param cid
	 *            l'id della competenza
	 * @return la competenza trovata, o <code>null</code> se non presente
	 */
	public Ability getAbility(long cid);

	/**
	 * Ottiene una lista di tutte le competenze inserite nel sistema.
	 * 
	 * @return la lista di tutte le competenze
	 */
	public List<Ability> getAll();

	/**
	 * Fornisce una lista di tutte le competenze non dichiarate dall'utente dato
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return la lista di competenze
	 */
	public List<Ability> getNotDeclaredBy(long uid);

	/**
	 * Ottiene i dati di tutti gli utenti che hanno dichiarato la competenza
	 * data.
	 * 
	 * @param cid
	 *            l'id della competenza
	 * @return la lista dei dati degli utenti associati
	 * @see UserData
	 */
	public List<UserData> getUserData(long cid);
}
